Contents
  1. 1. 类型概述
  2. 2. GC日志计算规则
  3. 3. 虚拟机环境
  4. 4. 测试环境含FULL GC
  5. 5. GC日志参数设置
  6. 6. 触发FULL GC的情况

类型概述

  • [DefNew 表示用的Serial 年轻代回收器
  • [ParNew 表示年轻代用的 Parnew
  • [PSYoungGen: 表示年轻代用的是 Parallel Scanvenge

[Times: user=0.06 sys=0.01, real=0.04 secs]
第一个是用户态消耗的CPU时间,第二个是内核消耗的CPU时间,第三个是用户实际消耗的时间
因为可能是多CPU协同完成的,所以real时间虽然加上了IO阻塞和线程等待,但是总时间还是小于user时间

其实只要看 第一个时间 0.0451720 这个时间即可

3.002: [GC [PSYoungGen: 63808K->10622K(74432K)] 63808K->11012K(244608K), 0.0451720 secs]

GC日志计算规则

堆内存信息

  • 回收器类型 JDK 1.7 默认是 Mark Sweep Compact
  • 最大堆区:设置的1500M
  • 最小500M, 而默认的新生代 和老年代的比例是2,所以 新生代的大小是500/3=166M
  • Eden:S=4,所以S0=166/6=27.75, Eden: 27.75*4=111M, 111 +27.75 +27.75=16
  • 都是不含S0区的大小
  • GC实际耗时 参考的是一个时间0.0314790秒 解决 real=0.04
  • FULL GC会触发 Minor GC OldGC PermGC

虚拟机环境

所以第一行: 113792 –> 13544K (142208)
年轻代GC前大小 –> 年轻代GC后大小 (年轻代容量 不含S0)

(500M/3)1024K=170666K (新生代总大小)
170666/6=28444K(S0区大小)
(170666/6)
5=142221( S0+Eden区的大小 也就是显示的 142208K)

113792 –>13544K(483585K) 堆内存GC前实际大小 –> GC后堆内存大小 (堆实际大小 不含S0区)
483585K+28444=512029K /1024=500M

MinorGClog分析

测试环境含FULL GC

因为测试环境用的是 Parallel GC回收器,系统会根据算法分配内存空间,从而获取最大的吞吐量(减少GC时间占用总时间的比率)
MinorGClog分析

GC日志参数设置

可以参照这个设置在 catelina.sh中配置
JAVA_OPTS=”-server -Xms500m -Xmx1500m -XX:PermSize=64m -XX:MaxPermSize=256m -XX:SurvivorRatio=4
-verbose:gc -Xloggc:/usr/local/jvmlog/gc.log
-Djava.awt.headless=true
-XX:+PrintGCDateStamps -XX:+PrintGCDetails
-Dsun.rmi.dgc.server.gcInterval=600000 -Dsun.rmi.dgc.client.gcInterval=600000 -XX:MaxTenuringThreshold=15”

-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式 基准时间是tomcat的启动时间)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径

触发FULL GC的情况

full gc是对新生代,旧生代,以及持久代的统一回收,由于是对整个空间的回收,因此比较慢,系统中应当尽量减少full gc的次数。

  • 旧生代空间不足
  • 持久代空间不足
  • CMS GC时出现了promotion failed和concurrent mode failure
  • 统计得到新生代minor gc时晋升到旧生代的平均大小小于旧生代剩余空间
  • 直接调用System.gc,可以DisableExplicitGC来禁止
Contents
  1. 1. 类型概述
  2. 2. GC日志计算规则
  3. 3. 虚拟机环境
  4. 4. 测试环境含FULL GC
  5. 5. GC日志参数设置
  6. 6. 触发FULL GC的情况